package com.sudo.boot.admin._sys;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import com.mybatisflex.core.paginate.Page;
import com.sudo.boot.base.pojo.JsonRes;
import com.sudo.boot.mapper.sys.model.bo.*;
import com.sudo.boot.mapper.sys.model.vo.SysUserDetailVo;
import com.sudo.boot.mapper.sys.model.vo.SysUserSimpleInfoVo;
import com.sudo.boot.mapper.sys.model.vo.SysUserPageVo;
import com.sudo.boot.mapper.sys.model.vo.SysUserSimpleVo;
import com.sudo.boot.service.sys.SysUserService;
import jakarta.annotation.Resource;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;

@RestController
@RequestMapping("sys-user")
public class SysUserController {

    @Resource
    private SysUserService sysUserService;

    /**
     * 新增用户 。
     *
     * @param bo 用户信息
     */
    @SaCheckPermission("user_add")
    @PostMapping("add")
    public JsonRes<Void> add(@RequestBody @Validated SysUserBoAdd bo) {
        sysUserService.add(bo);
        return JsonRes.ok();
    }

    /**
     * 编辑用户 。
     *
     * @param bo 用户信息
     */
    @SaCheckPermission("user_edit")
    @PostMapping("edit")
    public JsonRes<Void> edit(@RequestBody @Validated SysUserBoEdit bo) {
        sysUserService.edit(bo);
        return JsonRes.ok();
    }

    /**
     * 修改用户密码 。
     *
     * @param bo 密码信息
     */
    @SaCheckPermission("user_resetPassword")
    @PostMapping("resetPassword")
    public JsonRes<Void> resetPassword(@RequestBody @Validated SysUserBoPassword bo) {
        sysUserService.resetPassword(bo);
        return JsonRes.ok();
    }

    /**
     * 用户状态切换。
     *
     * @param bo 用户信息
     */
    @SaCheckPermission("user_status")
    @PostMapping("status")
    public JsonRes<Void> status(@RequestBody @Validated SysUserBoStatus bo) {
        sysUserService.status(bo);
        return JsonRes.ok();
    }

    /**
     * 根据主键删除系统用户 。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @SaCheckPermission("user_remove")
    @DeleteMapping("remove/{id}")
    public JsonRes<Void> remove(@PathVariable Serializable id) {
        sysUserService.deleteById(id);
        return JsonRes.ok();
    }


    /**
     * 根据系统用户 主键获取详细信息。
     *
     * @param id 系统用户 主键
     */
    @GetMapping("simpleInfo/{id}")
    public JsonRes<SysUserSimpleInfoVo> simpleInfo(@PathVariable Serializable id) {
        SysUserSimpleInfoVo simpleInfoVo = sysUserService.simpleInfoById(id);
        return JsonRes.ok(simpleInfoVo);
    }


    /**
     * 根据系统用户 主键获取详细信息。
     *
     * @param id 系统用户 主键
     */
    @SaCheckPermission("user_detail")
    @GetMapping("detail/{id}")
    public JsonRes<SysUserDetailVo> detail(@PathVariable Serializable id) {
        SysUserDetailVo detailVo = sysUserService.detailById(id);
        return JsonRes.ok(detailVo);
    }


    /**
     * 分页获取用户信息
     * @param bo 查询条件
     */
    @GetMapping("page")
    public JsonRes<Page<SysUserPageVo>> page(@Validated SysUserBoPageQuery bo) {
        Page<SysUserPageVo> page = sysUserService.page(bo);
        return JsonRes.ok(page);
    }

    /**
     * 根据角色Id查询用户
     */
    @SaCheckPermission("role_userList")
    @GetMapping("pageByRoleId")
    public JsonRes<Page<SysUserSimpleVo>> pageByRoleId(@Validated SysUserBoPageQuery bo) {
        Assert.notNull(bo.getRoleId(),"角色代码不能为空");
        Page<SysUserSimpleVo> simpleUserVoPage = sysUserService.pageByRoleId(bo);
        return JsonRes.ok(simpleUserVoPage);
    }

    /**
     * 模拟登陆。
     *
     * @param bo 用户信息
     */
    @SaCheckPermission("user_simulateLogin")
    @PostMapping("simulateLogin")
    public JsonRes<String> simulateLogin(@RequestBody @Validated SysUserBoSimulateLogin bo) {
        String tokenValue = sysUserService.simulateLogin(bo);
        return JsonRes.ok(tokenValue,"模拟登陆成功");
    }

    /**
     * 根据token将账号踢下线
     */
    @PostMapping("kickOutByToken")
    public JsonRes<Void> kickOutByToken() {
        String tokenValue = StpUtil.getTokenValue();
        StpUtil.kickoutByTokenValue(tokenValue);
        return JsonRes.okMsg("退出模拟登陆");
    }

    /**
     * 查看密码。
     *
     * @param id 用户ID
     */
    @SaCheckPermission("user_viewPassword")
    @GetMapping("viewPassword/{id:\\d+}")
    public JsonRes<String> simulateLogin(@PathVariable("id") Integer id) {
        String password = sysUserService.viewPassword(id);
        return JsonRes.ok(password);
    }
}
